Použití with

  • with nám může ušetřit práci i starosti s přemýšlením nad uzavřením otevřeného souboru
  • čtení celého souboru nemusíme dělat jen přes cyklus for, ale můžeme jej přečíst celý najednou metodou .read()

In [ ]:
soubor = open("soubor.txt", mode="r", encoding='utf-8')
novy_soubor = open("soubor2.txt", mode="w", encoding='utf-8')

for text in soubor:
    novy_soubor.write(text) 

print ("Soubor zkopírován.")

soubor.close()
novy_soubor.close()

In [ ]:
with open("soubor.txt", mode="r", encoding='utf-8') as soubor:
    with open("soubor2.txt", mode="w", encoding='utf-8') as novy_soubor:
        novy_soubor.write(soubor.read()) 
print ("Soubor zkopírován.")

Ukázkový příklad porušení DRY

Proč se tolik opakovat, když můžeme počet pokusů použít přímo, převést jej na řetězec a jen připojením přípony z něj udělat název souboru?


In [ ]:
def vykresliPanacka(pocet_pokusu):
    "Funkce na základě neúspěšných pokusů vypisuje obrázky, dokud hra neskončí."
    if pocet_pokusu == 1:
        vstup=open("1.txt", encoding='utf-8')
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 2:
        vstup=open("2.txt", encoding='utf-8')
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 3:
        vstup=open("3.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 4:
        vstup=open("4.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 5:
        vstup=open("5.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 6:
        vstup=open("6.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 7:
        vstup=open("7.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 8:
        vstup=open("8.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
    elif pocet_pokusu == 9:
        vstup=open("9.txt")
        obrazek = vstup.read()
        print(obrazek)
    else:
        vstup=open("10.txt")
        obrazek = vstup.read()
        print(obrazek)
        vstup.close()
        print ("Konec hry, prohrál jsi!")

In [ ]:
def vykresliPanacka(pocet_pokusu):
    "Funkce na základě neúspěšných pokusů vypisuje obrázky, dokud hra neskončí."
    with open(str(pocet_pokusu) + ".txt", encoding='utf-8') as soubor:
        print(soubor.read())

Je písmeno v textu?

Místo vlastní implementace je jednodušší použít operátor in.


In [1]:
def obsahuje(text, znak):
         try:
             text.index(znak)
             return True
         except ValueError:
             return False

In [2]:
obsahuje('text pro testovani', 'z')


Out[2]:
False

In [3]:
obsahuje('text pro testovani', 't')


Out[3]:
True

In [4]:
't' in 'text pro testovani'


Out[4]:
True

Šibenice a vyplnění jednoho znaku do hádaného slova


In [5]:
def vyplnZnak(hadanka, znak, tajneSlovo):
    for index in range(len(tajneSlovo)):
        if znak == tajneSlovo[index]:
            hadanka = hadanka[:index] + znak + hadanka[index + 1:]
    return hadanka

In [6]:
vyplnZnak('_______', 'a', 'kotatko')


Out[6]:
'___a___'

In [7]:
vyplnZnak('___a___', 't', 'kotatko')


Out[7]:
'__tat__'

In [8]:
vyplnZnak('__tat__', 'o', 'kotatko')


Out[8]:
'_otat_o'

In [9]:
vyplnZnak('_otat_o', 'z', 'kotatko')


Out[9]:
'_otat_o'

Obecné rady

  • Pochvala za hledání pomoci na internetu a používání nových věcí
  • Pochvala těm, kdo měli obrázky šibenice a japonské abecedy ve zvláštním souboru a ne přímo v kódu
  • Pochvala za psaní komentářů k funkcím a složitějšímu kódu